Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Polyglottes Programm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Polyglottes_Programm"> <link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Polyglottes_Programm rootpage-Polyglottes_Programm skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Polyglottes Programm</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p>Ein <b>polyglottes Programm</b> (<a href="Polyglossie" class="mw-redirect" title="Polyglossie">polyglott</a> = mehrsprachig) ist ein <a href="Computerprogramm" title="Computerprogramm">Computerprogramm</a>, dessen <a href="Quelltext" title="Quelltext">Quelltext</a> in mehr als einer <a href="Programmiersprache" title="Programmiersprache">Programmiersprache</a> gültig ist; d.&nbsp;h., es kann vom jeweiligen <a href="Interpreter" title="Interpreter">Interpreter</a> bzw. <a href="Compiler" title="Compiler">Compiler</a> jeder der dafür vorgesehenen Sprachen fehlerfrei ausgeführt bzw. übersetzt werden. In der Regel erzeugt es bei der Ausführung in den verschiedenen Sprachen jeweils dieselbe <a href="Eingabe_und_Ausgabe" title="Eingabe und Ausgabe">Ausgabe</a>. Ein solches Programm hat keinerlei Nutzen für die Allgemeinheit, seine Erstellung ist lediglich eine anspruchsvolle Übung für den <a href="Programmierer" class="mw-redirect" title="Programmierer">Programmierer</a>.
</p>

<div class="mw-heading mw-heading2"><h2 id="Funktionsweise">Funktionsweise</h2></div>
<p>Während es nahezu unmöglich sein dürfte, einen natürlichsprachigen polyglotten Text zu formulieren, ist die Erstellung eines polyglotten Programms weniger schwierig, als es zunächst den Anschein hat. Bei der Entwicklung polyglotter Programme macht man sich die folgenden Tatsachen bzw. Methoden zunutze:
</p>
<ul><li>Teile des Codes können in mehreren Programmiersprachen gültig sein, z.&nbsp;B. erzeugt „<code>printf&nbsp;("...")</code>“ sowohl in <a href="Perl_(Programmiersprache)" title="Perl (Programmiersprache)">Perl</a> als auch in <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a> eine textuelle Ausgabe.</li>
<li>Man kann durch <a href="Sprunganweisung" title="Sprunganweisung">Sprungbefehle</a> die in der jeweiligen Sprache ungültigen Teile des Quelltextes überspringen oder die Programmausführung mit <code>exit</code> „rechtzeitig“ vor dem Auftauchen ungültigen Codes terminieren.</li>
<li>Eine Programmzeile kann in der einen Programmiersprache ausführbaren Code, in der anderen einen <a href="Kommentar_(Programmierung)" title="Kommentar (Programmierung)">Kommentar</a> darstellen. Beispielsweise ist „<code>#&nbsp;include&nbsp;...</code>“ in <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a> eine <a href="Pr%C3%A4prozessor" title="Präprozessor">Präprozessoranweisung</a>, in vielen <a href="Skriptsprache" title="Skriptsprache">Skriptsprachen</a> – wegen des Zeichens „<code>#</code>“ am Zeilenanfang – eine Kommentarzeile.</li>
<li>In manchen Programmiersprachen (z.&nbsp;B. in <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a> mit einer Präprozessoranweisung) kann man <a href="Token_(Compilerbau)" class="mw-redirect" title="Token (Compilerbau)">Tokens</a> neu definieren oder vorhandene redefinieren und damit ein in einer fremden Programmiersprache gültiges Token auch in der eigenen – u.&nbsp;U. in einer anderen Bedeutung – gültig werden lassen.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Ein_einfaches_Beispiel">Ein einfaches Beispiel</h2></div>
<p>Das folgende Beispiel ist weit weniger spektakulär als die in den Weblinks referenzierten; es wurde speziell mit dem Ziel der Verständlichkeit auch für den Laien entworfen. Es macht von den ersten drei der oben genannten Techniken Gebrauch.
</p>
<table>
<tbody><tr>
<th class="hintergrundfarbe6">Quelltext
</th>
<th class="hintergrundfarbe6">Erläuterung
</th></tr>
<tr>
<td style="padding-top:5px;vertical-align:top">
<p><code>#&nbsp;include&nbsp;&lt;stdio.h&gt;&nbsp;/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><br>
<code>eval "echo 'Hello, world!'; exit";</code><br>
<code>sub echo { print "@_\n" }; __END__ */</code><br>
<code>main() { printf ("Hello, world!\n"); }</code><br>
</p>
</td>
<td style="padding-top:5px;vertical-align:top">
<p>Der nebenstehende Quelltext ist gültig in C, <a href="Perl_(Programmiersprache)" title="Perl (Programmiersprache)">Perl</a> und vielen <a href="Unix-Shell" title="Unix-Shell">Unix-Shells</a> (Bourne Shell, <a href="Korn-Shell" class="mw-redirect" title="Korn-Shell">Korn-Shell</a>, Bash, C-Shell, Z-Shell). Das Programm gibt den Text „<a href="Hallo-Welt-Programm" title="Hallo-Welt-Programm">Hello,&nbsp;world!</a>“ aus.
</p>
</td></tr>
<tr>
<td style="padding-top:10px;vertical-align:top">
<p><code># include &lt;stdio.h&gt; <span style="color:green">/*</span></code><br>
<code><span style="color:green">eval "echo 'Hello, world!'; exit";</span></code><br>
<code><span style="color:green">sub echo { print "@_\n" }; __END__ */</span></code><br>
<code>main() { printf ("Hello, world!\n"); }</code><br>
</p>
</td>
<td style="padding-top:10px;vertical-align:top">
<p><b>C</b><br>
Der von <code>/*</code> und <code>*/</code> eingeschlossene Text (hier grün eingefärbt) ist in C Kommentar und wird ignoriert. Der Rest ist eine Variante des <a href="Liste_von_Hallo-Welt-Programmen/H%C3%B6here_Programmiersprachen#C" title="Liste von Hallo-Welt-Programmen/Höhere Programmiersprachen">Hallo-Welt-Programms in C</a>.
</p>
</td></tr>
<tr>
<td style="padding-top:10px;vertical-align:top">
<p><code><span style="color:green"># include &lt;stdio.h&gt; /*</span></code><br>
<code>eval "echo 'Hello, world!'; exit";</code><br>
<code><span style="color:#AAAAAA">sub echo { print "@_\n" }; __END__ */</span></code><br>
<code><span style="color:#AAAAAA">main() { printf ("Hello, world!\n"); }</span></code><br>
</p>
</td>
<td style="padding-top:10px;vertical-align:top">
<p><b>Unix-Shells</b><br>
Die erste Zeile (grün) ist eine Kommentarzeile und wird ignoriert. Wenn die <code>eval</code>-Anweisung ausgeführt wurde, terminiert das Programm wegen des <code>exit</code>; der Rest (grau) wird vom Interpreter nicht mehr eingelesen und daher auch nicht auf korrekte <a href="Syntax" title="Syntax">Syntax</a> geprüft.
</p>
</td></tr>
<tr>
<td style="padding-top:10px;vertical-align:top">
<p><code><span style="color:green"># include &lt;stdio.h&gt; /*</span></code><br>
<code>eval "echo 'Hello, world!'; exit";</code><br>
<code>sub echo { print "@_\n" }; __END__ <span style="color:#AAAAAA">*/</span></code><br>
<code><span style="color:#AAAAAA">main() { printf ("Hello, world!\n"); }</span></code><br>
</p>
</td>
<td style="padding-top:10px;vertical-align:top">
<p><b>Perl</b><br>
Die erste Zeile ist Kommentar. Die <code>eval</code>-Anweisung wird erst ausgeführt, nachdem in Zeile&nbsp;3 die <a href="Unterprogramm" title="Unterprogramm">Subroutine</a> <code>echo</code> definiert wurde. Der auf das <a href="Schl%C3%BCsselwort_(Informatik)" class="mw-redirect" title="Schlüsselwort (Informatik)">Schlüsselwort</a> <code>__END__</code> folgende Rest (grau) wird vom Perl-Interpreter gelesen, aber ignoriert.
</p>
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="Ein_komplexeres_Beispiel">Ein komplexeres Beispiel</h2></div>
<p>Der folgende Quelltext ist gültig in C, <a href="PHP" title="PHP">PHP</a> und Bash. Es werden alle oben beschriebenen Methoden genutzt, insbesondere ist für die Kompatibilität mit C in etlichen Fällen die Neu- oder Umdefinition von Zeichenfolgen erforderlich. Diese erfolgen in den mit „<code>#define</code>“ beginnenden Zeilen, die für die beiden Skriptsprachen Kommentarzeilen sind.
</p>
<table>

<tbody><tr>
<td>
<pre>#define a /*
#&lt;?php
echo "\010Hello, world!\n"// 2&gt; /dev/null &gt; /dev/null \&nbsp;;
// 2&gt; /dev/null; x=a;
$x=5 // 2&gt; /dev/null \&nbsp;;
if (($x))
// 2&gt; /dev/null; then
return 0;
// 2&gt; /dev/null; fi
#define e&nbsp;?&gt;
#define b */
#include &lt;stdio.h&gt;
#define main() int main()
#define printf printf(
#define true )
#define function
function main()
{
printf "Hello, world!\n"true/* 2&gt; /dev/null | grep -v true*/;
return 0;
}
#define c /*
main
#*/
</pre>
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="MS-DOS_und_Perl">MS-DOS und Perl</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Hello,_world!"><span id="Hello.2C_world.21"></span>Hello, world!</h3></div>
<p>Das folgende Programm kann durch den Perl-Interpreter oder als <a href="MS-DOS" title="MS-DOS">DOS</a>-<a href="Stapelverarbeitung" title="Stapelverarbeitung">Batchdatei</a> ausgeführt werden. (Erläuterungen zu jeder Zeile rechts neben dem Quelltext.)
</p>
<table>
<tbody><tr>
<th class="hintergrundfarbe6">Quelltext
</th>
<th class="hintergrundfarbe6">DOS
</th>
<th class="hintergrundfarbe6">Perl
</th></tr>
<tr>
<td style="padding-top:0px;vertical-align:top">
<pre>@rem = '
@echo Hello, world!
@goto END
';
print substr "@rem", 7, 13;
__END__
: END
</pre>
</td>
<td style="padding-top:0px;vertical-align:top">
<pre>Kommentar
Ausgabe
Sprung ans Ende
wird übersprungen
wird übersprungen
wird übersprungen
Ende Code
</pre>
</td>
<td style="padding-top:0px;vertical-align:top">
<pre>Definition des Arrays @rem
Inhalt des Arrays @rem
Inhalt des Arrays @rem
Ende der Definition von @rem
Ausgabe Teilstring aus @rem
Ende Code
wird ignoriert
</pre>
</td></tr></tbody></table>
<div class="mw-heading mw-heading3"><h3 id="DOS-Wrapper_für_Perl"><span id="DOS-Wrapper_f.C3.BCr_Perl"></span>DOS-Wrapper für Perl</h3></div>
<p>In ähnlicher Weise kann eine DOS-Batchdatei für den Aufruf eines Perl-Programms erstellt werden: Die DOS-Batchdatei enthält den Perl-Code und führt sich selbst (in Zeile 10) mit dem Perl-Interpreter aus. Es bedarf allerdings einigen Aufwandes, die <a href="Kommandozeile" title="Kommandozeile">Kommandozeilen</a>-Argumente einzusammeln und an Perl zu übergeben:
</p>
<table>

<tbody><tr>
<td>
<pre>@rem = ' ---------- BEGIN DOS ------------------
@echo off
set PROG=%0.bat
&nbsp;: ARG LOOP
if "%1" == "" goto EXEC
set ARGS=%ARGS% %1
shift
goto ARG LOOP
&nbsp;: EXEC
perl %PROG% %ARGS%
goto END
';
# ================ BEGIN PERL ==================

print "Perl here with these arguments: @ARGV\n";

__END__ # ========= END PERL ===================
: END
set PROG=
set ARGS=
:: ---------------- END DOS --------------------
</pre>
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="Siehe_auch">Siehe auch</h2></div>
<p>Weitere Beispiele für nutzlose, aber lehrreiche Programme:
</p>
<ul><li><a href="Hallo-Welt-Programm" title="Hallo-Welt-Programm">Hallo-Welt-Programm</a> – die Ausgabe von „Hallo, Welt“ in den unterschiedlichsten Programmiersprachen</li>
<li><a href="Quine_(Computerprogramm)" title="Quine (Computerprogramm)">Quine</a> – Programme, die ihren eigenen Quelltext ausgeben</li>
<li><a href="Just_another_Perl_hacker" title="Just another Perl hacker">Just another Perl hacker</a> – kreative Perl-Programme, die in origineller Weise „Just another Perl hacker“ ausgeben</li>
<li>Programme in <a href="Esoterische_Programmiersprache" title="Esoterische Programmiersprache">Esoterischen Programmiersprachen</a></li>
<li>Programmbeiträge für „Obfuscated Contests“ (z.&nbsp;B. <a href="Obfuscated_Perl_Contest" title="Obfuscated Perl Contest">Obfuscated Perl Contest</a>, <a href="International_Obfuscated_C_Code_Contest" title="International Obfuscated C Code Contest">International Obfuscated C Code Contest</a>)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<p><i>(Alle hier angegebenen Quellen sind in englischer Sprache.)</i>
</p>
<ul><li><a rel="nofollow" class="external text" href="http://ideology.com.au/polyglot/">Ein 8-fach polyglottes Programm</a> (ausführbar in <a href="Unix-Shell" title="Unix-Shell">Unix-Shell</a>, <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a>, <a href="COBOL" title="COBOL">COBOL</a>, <a href="Fortran" title="Fortran">Fortran</a>, <a href="Pascal_(Programmiersprache)" title="Pascal (Programmiersprache)">Pascal</a>, <a href="Perl_(Programmiersprache)" title="Perl (Programmiersprache)">Perl</a>, <a href="PostScript" title="PostScript">PostScript</a> und <a href="X86-Architektur" title="X86-Architektur">x86</a>-<a href="Assembler_(Informatik)" title="Assembler (Informatik)">Assembler</a>)</li>
<li><a rel="nofollow" class="external text" href="http://people.ksp.sk/~misof/programy/polyglot7.html">Ein 7-fach polyglottes Programm</a> (ausführbar in <a href="Bourne-again_shell" class="mw-redirect" title="Bourne-again shell">Bash</a>, <a href="Befunge" title="Befunge">Befunge</a>, <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a>, Pascal, Perl, <a href="PostScript" title="PostScript">PostScript</a> und <a href="TeX" title="TeX">TeX</a>)</li>
<li><a rel="nofollow" class="external text" href="http://www.retas.de/thomas/computer/programs/useless/misc/polyglot/index.html">Ein 6-fach polyglottes Programm</a> (ausführbar in <a href="Brainfuck" title="Brainfuck">Brainfuck</a>, <a href="Befunge" title="Befunge">Befunge</a>, C, Perl, <a href="Unix-Shell" title="Unix-Shell">Unix-Shell</a> und <a href="Whitespace_(Programmiersprache)" title="Whitespace (Programmiersprache)">Whitespace</a>)</li>
<li><a rel="nofollow" class="external text" href="http://head.wall.sk/page/polyglot/">Ein 4-fach polyglottes Programm</a> (ausführbar in <a href="ANSI_C" class="mw-redirect" title="ANSI C">ANSI C</a>, Perl, <a href="Tcl" title="Tcl">Tcl</a> und Unix-Shell)</li>
<li><a rel="nofollow" class="external text" href="http://www.nyx.net/~gthompso/poly/polyglot.htm">Eine Zusammenstellung mit 14 polyglotten Programmen</a></li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2022-09-20" href="https://de.wikipedia.org/wiki/?title=Polyglottes_Programm&amp;oldid=226330095">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>